<?php
// +----------------------------------------------------------------------
// | B5Yii2CMF V3.0 [快捷通用基础管理开发平台]
// +----------------------------------------------------------------------
// | Author: 冰舞 <357145480@qq.com>
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace common\helpers;

use Yii;

/**
 * redis/缓存锁，用于秒杀，并发库存
 * @package common\helpers
 */
class Lock
{
    public static bool $isRedis = true;
    /**
     * 获取锁，成功返回时间戳，失败返回0
     * @param $key
     * @param int $expire
     * @return int
     */
    public static function lock($key, $expire = 5): int
    {
        $value = intval(microtime(true) * 1000);
        if (self::$isRedis) {
            // 使用 redis
            if (Yii::$app->redis->set('l_' . $key, $value, 'NX', 'EX', $expire) == 1) {
                return $value;
            }
            return 0;
        } else {
            // 文件缓存时使用
            if (Yii::$app->cache->exists($key)) {
                return 0;
            } else {
                $res = Yii::$app->cache->add($key,$value,$expire);
                return $res?$value:0;
            }
        }
    }

    /**
     * 移除锁
     * @param $key
     * @param $version
     */
    public static function unlock($key, $version)
    {
        if (self::$isRedis) {
            $script = <<<LUA
if redis.call('GET',KEYS[1]) == ARGV[1] then
    return redis.call('DEL', KEYS[1])
else
    return 0
end    
LUA;
            Yii::$app->redis->eval($script, 1, 'l_' . $key, $version);
        } else {
            if(Yii::$app->cache->get($key) == $version){
                Yii::$app->cache->delete($key);
            }
        }
    }
}